자기 모듈 도메인에서 커스텀 디버그를 자기가 지정한 파일에 남기려면 간단히는 아래처럼 하면 된다.
ap_replace_stderr_log(r->pool, "/var/log/apache2/my.log");
ap_log_perror(APLOG_MARK, APLOG_ERR, 0, r->pool, "qqqqqqqq");
파일명에 시간값을 주면 롤링처리 비슷하게 될 것이다.
이때도 ap_log_error를 사용하면 통상 에러 로그 도메인에 맞추어 로그가 나간다.
아파치 모듈은 설정상 에러 로그를 모듈을 타겟팅해서 보낼 수 없다. (단, 에레 레벨은 타겟팅 가능하다)
request_rec->notes를 이용한 방법이 유일하게 존재하지만, 실험결과 리퀘스트-리스판스 한 싸이클에 한 번의 출력기회만 있다.
게다가 아파치 로그는 보안상 에러로그에 특수문자 탑재가 안된다. 파이프에 의한 인젝션등을 사전 차단하기 위한 것으로 보인다. 이게 무엇이 문제냐면, 캐리지 리턴을 못 넣는다. 로그의 가독성이 현저하게 떨어진다.
즉, 건건이 넣으면 시간과 캐리지 리턴을 표시하여 줄바꿈을 할 수 있지만, request_rec->notes에 의해서는 단 한번만 출력이 가능하므로 한 건의 로그로만 기록이 되고, 줄바꿈은 할 수 없다.
다시 요약하면,
현재까지 조사/실험 결과 아파치 에러로그는 vhost에 대해서만 로그를 분할 할 수 있는 것 같다. 이것은 모듈 타겟팅 로그로는 불합격이다. 게다가 모듈에서는 저마다의 사정상 파일명이 서로 다른 로그를 찍고 싶을 때가 존재할 것이지만 가용 자원내에서는 존재하지 않는 것 같다.
다시 돌아가서 위 방식으로 로그를 찍으면 어떨까.
일단 멀티 프로세스 상황에서 stderr을 파일로 변경하는 시점과 로그를 실제로 찍는 시점과의 atomic 문제가 있다. 다행인 점은 httpd 프리포크 상황에서 위와 같은 방식의 로그를 사용하는 자원은 1차원적으로 코드가 흐른다는 점이다. 즉, request_rec 자원도 한 개이며 코드의 흐름도 한 줄이기 때문에 멀티 프로세스에 의해서 atomic 붕괴는 우려하지 않아도 된다. stderr을 다른 코드 시점에서 변경될 가능성은 현 분석 시점에서 없는 것 같다.
다른 쓸만한 방법으로는 request_rec->notes의 로그를 rotate 툴에 보내듯이, 파이프를 통해서 후가공 처리 하는 곳으로 보내는 것이다. 해당 툴에서는 delimiter를 이용해서 줄바꿈을 잘 해주면 되지 않을까?